package com.glls.stream;

import com.glls.lambda.pojo.Student;
import org.junit.Test;

import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * @date 2022/10/4
 * @desc  终止操作
 *
 * 归约  与 收集
 *
 * 归约  将流中的元素  反复结合起来 得到一个最终的结果
 */
public class StreamDemo5 {

    List<Student> list = Arrays.asList(
            new Student(1,"zs",18,88.0),
            new Student(2,"ls",19,88.5),
            new Student(3,"ww",21,98.0),
            new Student(4,"zl",19,86.0),
            new Student(5,"tq",17,92.0),
            new Student(5,"tq",17,92.0)
    );

    @Test
    public void test(){
        //归约
        //reduce(T iden,BinaryOperator binaryOperator)
        //reduce(BinaryOperator binaryOperator)

        Optional<Double> reduce = list.stream().map(Student::getScore).reduce(Double::sum);

        System.out.println(reduce.get());



    }

    @Test
    public void test2(){
        //归约
        //reduce(T iden,BinaryOperator binaryOperator)
        //reduce(BinaryOperator binaryOperator)

        List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

        // 第一个参数是 0  0 作为起始值   先把起始值作为 x  ,再从流中拿一个元素 作为 y   计算x+y 得到结果  再把结果作为
        //x    再从流中拿一个元素 作为y   循环进行  得到最终的结果
        Integer reduce = integers.stream().reduce(0, (x, y) -> x + y);

        System.out.println(reduce);


    }




    // 重点来了   收集操作

    @Test
    public void test3(){
        //业务场景  你从数据库查询到了所有的学生信息   假设就是上面的 list
        // select * from t_student where score > 90
        //需求 是得到90分以上的学生集合
        List<Student> collect = list.stream()
                .filter((s) -> s.getScore() > 90)
                //.forEach(System.out::println);
                .collect(Collectors.toList());

        collect.forEach(System.out::println);
    }


    @Test
    public void test4(){
        Set<Student> collect = list.stream()
                .filter((s) -> s.getScore() > 90)
                .collect(Collectors.toSet());

        System.out.println(collect.size());
    }


    @Test
    public void test5(){

    }



}
